
/**
 * @file singletonguard.h
 * @brief 单例保护机制头文件，提供跨平台单例应用程序支持
 *        通过系统互斥体(Windows)或共享内存(其他平台)确保程序唯一实例
 * @note  Windows 平台使用内核级互斥体实现，其他平台使用共享内存方案
 */

#ifndef SINGLETONGUARD_H
#define SINGLETONGUARD_H


/**
 * @class SingletonGuard
 * @brief 单例保护机制抽象基类
 * @details 定义单例检测统一接口，子类需实现具体平台相关逻辑
 */
#include <QString>

class SingletonGuard {
public:
    virtual ~SingletonGuard() = default;
    virtual bool isSingleInstance() = 0;
};


#ifdef Q_OS_WIN // Windows 专有代码需要条件编译

/**
 * @class MutexSingletonGuard
 * @brief Windows 平台单例保护实现类
 * @details 通过系统命名互斥体检测程序实例唯一性
 * @note  互斥体生命周期与对象绑定，析构时自动释放
 */

#include <Windows.h>
#include <QMessageBox>

class MutexSingletonGuard : public SingletonGuard {
public:
    explicit MutexSingletonGuard(const QString& appName);

    ~MutexSingletonGuard() override;

    bool isSingleInstance() override;

private:
    HANDLE hMutex = nullptr;
    bool m_isSingle = false;
};
#endif



/**
 * @class SharedMemorySingletonGuard
 * @brief 跨平台单例保护实现类
 * @details 通过共享内存存在性判断程序实例唯一性
 * @warning 需确保 appName 全局唯一，避免不同程序冲突
 */

#include <QSharedMemory>

class SharedMemorySingletonGuard : public SingletonGuard {
public:
    explicit SharedMemorySingletonGuard(const QString& appName);

    ~SharedMemorySingletonGuard() override;

    bool isSingleInstance() override;

private:
    QSharedMemory sharedMemory;
    bool m_isSingle = false;
};



/**
 * @class SingletonGuardFactory
 * @brief 单例保护对象工厂类
 * @details 封装对象创建逻辑，隔离平台差异
 */

#include <memory>
#include <QString>

enum class SingletonType { SystemMutex, SharedMemory};

class SingletonGuardFactory {
public:
    static std::unique_ptr<SingletonGuard> create(SingletonType type, const QString& appName);
};

bool checkOnly(const QString &appName);

#endif // SINGLETONGUARD_H
